#include <stdio.h>
#include <stdlib.h>
#include "Status.c"
/**
  线性表
  ADT {
      数据
      关系 1:1
      操作 初始化 插入 查找 取值 删除
  }

    typedef struct {
        char *elem; // 元素基地址
        int length; // 当前长度
    } SqList;
 */
#define MAXSIZE 100

// 图书
typedef struct Book{
    char no[20]; // 图书ISBN
    char name[100]; // 图书名字
    float price; // 图书价格
}Book;

// 图书列表
typedef struct BookList{
    Book *elem; // 存储空间基地址
    int length; // 图书表中当前图书个数
}BookList; 

// 初始化1
Status InitList(BookList *L) {
    L->elem = (Book *)malloc(sizeof(Book)*MAXSIZE); // 申请Book数组内存
    if (!L->elem) return OVERFLOW; // 申请内存失败
    L->length = 0; // 空表长度为0
    return OK;
}
// 初始化2
// Status InitList2(BookList &L) {
//     L->elem = new Book[MAXSIZE]; // 申请Book数组内存
//     if (!L->elem) return OVERFLOW; // 申请内存失败
//     L->length = 0; // 空表长度为0
//     return OK;
// }

// 销毁
void DestroyList(BookList *L) {
    if (L->elem) {
        free(L->elem);
    }
}

// 清空
void ClearList(BookList *L) {
    L->length = 0;
}

// 判断是否是空
int IsEmpty(BookList L) {
    return L.length == 0 ? 1:0;
}

// 取值
int GetElem(BookList L,int i,Book *b) {
    if (i < 1 || i > L.length) return ERROR;
    *b = L.elem[i-1];
    return OK;
}

// 查找
int LocateElem(BookList L,Book k) {
    for (int i=0;i<L.length;i++) {
        if (L.elem[i].no == k.no) {
            return i + 1;
        }
    }
    return 0;
}

// 插入 时间复杂度O(n)  平均移动次数 n/2
Status InsertElem(BookList *L,int i,Book *k) {
    if (i < 1 || i > MAXSIZE) {
        return ERROR;
    }
    if (L->length == MAXSIZE) {
        return ERROR;
    }
    // 元素后移
    for (int j=L->length-1;j >= i-1;j >= i-1,j--) {
        L->elem[j+1] = L->elem[j];
    }
    // 插入指定元素
    L->elem[i-1] = *k;
    // 增加元素个数
    L->length++;
    
    return OK;
}

// 删除 平均移动次数 （n-1）/2  平均复杂度O(n)
Status DeleteElem(BookList *L,int i) {
    if (i < 1 || i > L->length) {
        return ERROR;
    }
    for (int j=i;j<L->length;j++) {
        L->elem[j-1] = L->elem[j];
    }
    L->length--;
    return OK;
}

int main () {
    BookList *list;
    Book temp;
    int n = InitList(list);
    
    printf("初始化 %d\n",n);

    Book b1 = {"100","语文",11};
    InsertElem(list,1,&b1);

    Book b2 = {"101","数学",12};
    InsertElem(list,2,&b2);

    Book b3 = {"102","英语",13};
    InsertElem(list,3,&b3);


    for (int i = 1;i<4;i++) {
        printf("进入循环 %d\n",i);
        int r = GetElem(*list,i,&temp);
        if (r == 0)
        {
            printf("b%d no=%s, name=%s\n",i,temp.no,temp.name);
        }
        
    }

    for (int i = 0;i<list->length;i++) {
        printf("进入循环2 %d\n",i);
        
        printf("b%d no=%s,name=%s,price=%f\n",i+1,list->elem[i].no,list->elem[i].name,list->elem[i].price);
        
    }
    return 0;
} 